const WebSocket = require("ws");
const wss = new WebSocket.Server({ port: 8111 });

let previousPrice = null; // 用于存储前一个价格
let countdownTimer = null; // 用于存储倒计时的定时器
let remainingTime = 120; // 初始倒计时为2分钟（120秒）

wss.on("connection", (ws) => {
  // 当接收到消息时处理
  ws.on("message", (message) => {
    try {
      let data;
      // 判断消息类型，如果是 Buffer 则转换为字符串
      if (Buffer.isBuffer(message)) {
        const jsonString = message.toString();
        data = JSON.parse(jsonString);
      } else {
        data = JSON.parse(message);
      }

      console.log("历史数据:", data);
      console.log(new Date());
      console.log("最新数据:", data[0]);

      // 获取最新价格
      const latestData = data[0];
      let currentPrice = latestData.price.toFixed(3); // 保留三位小数

      // 判断价格是否变化
      if (previousPrice !== null && previousPrice !== currentPrice) {
        // 如果有倒计时存在，清除它
        if (countdownTimer) {
          clearInterval(countdownTimer);
        }

        // 重置倒计时为2分钟
        remainingTime = 120;

        // 启动一个2分钟的倒计时
        countdownTimer = setInterval(() => {
          // 每秒更新倒计时
          if (remainingTime > 0) {
            // 打印倒计时到服务器控制台
            console.log(
              `上次${data[1].price},当前${currentPrice}，${remainingTime} 秒...`
            ); // 后端打印倒计时

            // 发送倒计时剩余时间给客户端
            ws.send(
              JSON.stringify({
                type: "info",
                message: `上次${previousPrice},当前${currentPrice}，${remainingTime} 秒...`,
              })
            );
            remainingTime--;
          } else {
            // 倒计时结束
            clearInterval(countdownTimer);
            ws.send(
              JSON.stringify({
                type: "info",
                message: "价格更新已完成。",
                latestData: latestData,
              })
            );
            console.log("2分钟倒计时结束，执行操作！");
          }
        }, 1000); // 每秒执行一次
      }

      // 更新前一个价格
      previousPrice = currentPrice;

      // 构造响应数据
      const responseData = {
        type: "data",
        historicalData: data, // 发送历史数据
        latestData: latestData, // 最新数据
      };

      // 广播消息给所有客户端
      wss.clients.forEach((client) => {
        if (client.readyState === WebSocket.OPEN) {
          client.send(JSON.stringify(responseData));
        }
      });
    } catch (error) {
      console.error("解析消息时出错:", error);
      ws.send(
        JSON.stringify({
          type: "error",
          message: "数据格式错误，请检查输入数据。",
        })
      );
    }
  });

  // 向客户端发送连接成功的消息
  ws.send(
    JSON.stringify({
      type: "info",
      message: "WebSocket 连接已成功建立。",
    })
  );
});

console.log("WebSocket 服务器已启动，监听端口 8111");
